package com.etc.service.impl;

import com.etc.dao.AccountDAO;
import com.etc.entity.Account;
import com.etc.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * 1. 无任何注解的使用:  无任何异常，测试正常。
 * 2. 无任何注解的使用:  trans3的方法手动引发异常,RuntimeException. 前后数据不一致
 * 3. 加入注解: trans2,trans3的方法手动引发异常,RuntimeException,导致sql执行一个成功一个失败 ，但是由于
 * propagation =  Propagation.REQUIRED),我们的第三个方法也会加入到第二个方法对应的事务中来管理。所以事务会回滚.
 * 前后数据一致.
 */
@Service
public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountDAO dao;

    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public void trans1() {
        //测试用的，先放着
        //账号为1的用户转入100
        dao.transin(1,100);
        //时间间隔 20秒
        try {
            Thread.sleep(200000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //账号为2的用户转出100
        dao.transout(2,100);
    }

    /**
     * READ_UNCOMMITTED 我这个事务可以读到别的事务修改了，尚未提交的数据
     * @Transactional(isolation = Isolation.READ_UNCOMMITTED)
     * 如果要避免脏读
     * @Transactional(isolation = Isolation.READ_COMMITTED)
     *
     * @param accoutid
     * @return
     */
    @Transactional(isolation = Isolation.READ_COMMITTED)
    @Override
    public Account getAccountById(int accoutid) {
        return dao.selectByPrimaryKey(accoutid);
    }

    @Transactional(propagation =  Propagation.REQUIRED)
    @Override
    public void trans2(int flag) {
        dao.transin(1,100);

        //调用trans3
        trans3(2);
//        if (flag == 1){
//            throw  new RuntimeException("ex-trans2...");
//        }
    }

    @Override
    public void trans3(int flag) {
        dao.transout(2,100);
        if (flag == 2){
            throw  new RuntimeException("ex-trans3...");
        }

    }
}
